package com.lyrcsoft.rxjava1x;

import rx.Observable;
import rx.Observer;
import rx.Subscriber;

/**
 * 在RxJava中主要有4个角色：
 * <p>
 * Observable
 * Subject
 * Observer
 * Subscriber
 *
 * @author fujc2dev@126.com
 * @date 2024-11-15
 */
public class Rx1Demo3 {

    /**
     * Observable  Subject：主题，被观察者，就是我们关注的数据源，在普通的观察者模式里面，维护的就是一系列观察者，当有新的事件时，会通知所有的观察者。
     * Observer Subscriber：观察者，在普通的观察者模式里面会有update方法
     * RxJava中添加了普通观察者模式缺失的三个功能：
     * 1. RxJava中规定当不再有新的事件发出时，可以调用onCompleted()方法作为标示；
     * 2. 当事件处理出现异常时框架自动触发onError()方法；
     * 3. 同时Observables支持链式调用，从而避免了回调嵌套的问题。
     *
     * @param args
     */
    public static void main(String[] args) {
        // 第一步：创建观察者。Rx里面的观察者增强了
        Observer<Integer> observer = new Observer<Integer>() {

            @Override
            public void onCompleted() {
                System.out.println("onCompleted");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println("onError");
            }

            @Override
            public void onNext(Integer s) {
                System.out.println("Item is " + s);
            }
        };
        // 第二步：创建被观察者
        Observable<Integer> observable = Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                for (int i = 0; i < 10; i++) {
                    subscriber.onNext(i);
                }
            }
        });
        // 第三步：被观察者订阅观察者，或者说，观察者与被观察者建立关系
        //
        observable.subscribe(observer);
        // 分析与对比：
        /*
         *  被观察者observable：其内部的call函数，这个call函数的调用时机在哪里？
         *  Observable.create ==> 创建返回的是 Observable<Integer>
         *  Observable.create ==> 需要的参数是OnSubscribe<Integer>，这个OnSubscribe<Integer>内部封装了call函数
         *  Observable.create ==> 内部优先会执行onObservableCreate.call，跟踪进去感觉一顿花里胡哨，返回的还是我们传进去的OnSubscribe<Integer>
         *  onObservableCreate.call ==> TODO 暂时还不清楚这里面做了那些事情
         *  Observable.create ==> 结束：返回了一个new Observable<Integer>(x)；
         * observable.subscribe(observer) ==>
         * subscribe：传递参数是一个被观察者对象。
         * RxJavaHooks.onObservableStart(observable, observable.onSubscribe).call(subscriber);
         * RxJavaHooks.onObservableStart与Observable.create里面执行逻辑查不多，一顿花里胡哨，返回的还是我们传进去的OnSubscribe<Integer>
         * 最后OnSubscribe<Integer>执行了自己的call方法。
         * 至此，被观察者与观察者建立关系，并且被观察者开始工作，调用call，开始发送事件。
         *  最外层感觉好像与观察者一模一样。
         */
    }


}
